Skip to main content

Known issue — plume-axis river-mile arrays empty (defer)

Status: Parked pending results validation work. River-mile overlays on CXPLT/CTPLT and related UI are ignored for now.

Symptoms

Responses from GET …/results/cxplt/plume-river-mile-axis (and the …/results/ctplt/plume-river-mile-axis alias) can show:

  • has_data: true and miles populated (dense distance axis, same count as concentration tables), but
  • mainstem_river_mile and tributary_river_mile as [] (length 0), not parallel to miles.

When those arrays are empty, the client cannot merge or interpolate CTL-style mainstem/tributary miles along the spill path; dual-axis RM traces and CTPLT “Mainstem RM / Tributary RM” copy stay blank.

Historical behavior before a regression window is unclear; incremental API edits were minimal, yet the symptom appeared (empty RM arrays alongside non-empty miles).

Intended server contract

rsms-api-fastapi plume_river_mile_axis_sync (app/results/service.py) should fill mainstem_river_mile and tributary_river_mile via RMI + try_river_mile_grid_for_cxplt, with meta.river_mile_profile describing success or failure (ok, subset/RMI failures, etc.). Rows only fill when subset + grid parity succeed for the scenario’s segments, river, river_mile, and riverbasin RMI blob alignment.

spill_ctl_river_miles (mainstem_intersection.py) maps spill location to CTL coordinates compatible with RiverMileStructure / Neutshell; junction logic for tributaries follows 981.8 − Ohio-mile-at-mouth, not raw Ohio-only numbers for the mainstem CTL field.

Likely contributors (investigation backlog)

  1. Scenario table JSON missing segments (< 2) so RMI subset never builds grids.
  2. RMI download / try_river_mile_grid_for_cxplt returning non‑ok → empty lists while mile axis remains.
  3. Mismatch between plume m_count and built pair lists (parity checks fail).

Frontend (temporary)

Various mergePaddedConcWithPlumeRm, sliceInfoFromPlumeForCtpltMile, and Results memo helpers assume aligned arrays (or gated on river_mile_profile.status) once work resumes—no UX requirement until validation passes.